package br.ufrj.dcc.so.trab2.manager;

import br.ufrj.dcc.so.trab2.Barbearia;
import br.ufrj.dcc.so.trab2.Forte;
import br.ufrj.dcc.so.trab2.entity.Cliente;
import br.ufrj.dcc.so.trab2.entity.Pausa;


public class SargentoTainha extends Pessoa implements Runnable {
	private Barbearia barbearia;
	private Forte forte;
	private boolean vivo = true;
	private int cicloVida = 100;
	
	public SargentoTainha(Forte forte) {
		this.forte = forte;
		this.barbearia = forte.barbearia;
		vivo = true;
		System.out.println("SargentoTainha criado em :\t"+System.currentTimeMillis());
	}

	/**
	 * Mátodo que permite que um cliente entre ou não na barberia
	 * 
	 * � o respons�vel pelo acesso ao interior da barbearia. Periodicamente, tenta adicionar 
	 * um (e somente um) novo cliente � fila de cadeiras da barbearia (20 cadeiras) caso haja 
	 * lugar dispon�vel. A periodicidade deve ser simulada como vari�vel (entre 1 e 5 segundos).
	 * 
	 * O SargentoTainha � uma Thread, ele tem acesso ao forte e a barbearia.
	 * 
	 * @param cliente Cliente que deseja entrar.
	 * @return Resposta dizendo se o cliente entrou ou não.
	 */
	public boolean addCliente(Cliente cliente) {
		boolean addOK = true;

			
		barbearia.addClienteEspera(cliente);
			
		forte.getClienteDisponivel().release();
			
		
			
		return addOK;
	}

	public void setBarbearia(Barbearia barbearia) {
		this.barbearia = barbearia;
	}

	public void closeBarbearia() {
		barbearia.close();
		
	}
	
	public void mata()
	{
		vivo = false;
	}

	@Override
	public void run() {
		int numPausas = 0;
		while(vivo)
		{
			/*
			 * Ele esta vivo esperando os clientes e colocando eles para dentro da barbearia
			 * sempre que possivel.
			 */
			
			//O corrento 3 pausas seguidas, o Sargento Tainha fecha a berbearia.  
			if (numPausas > 3) break;
			
			Cliente cliente = forte.getProximoCliente();
			
			if(cliente instanceof Pausa){
				numPausas++;
				//Pausa n�o deve ser adicionada na barbearia
				continue;
			}else{
				numPausas = 0;
			}
			
			boolean addOK = addCliente(cliente);
			if(!addOK){
				//TODO - contabilizar. N�o seria para o Escovinha contabilizar ?
			}
			else
			{
				//Cliente rejeitado
				System.out.println("LOTADO :\t"+cliente.getPatente());
			}
			sleep();	
			
			//morte prematura
			if(--cicloVida<0)vivo=false;
		}		

		barbearia.close();
		System.out.println("SargentoTainha morreu em :\t"+System.currentTimeMillis());
	}
	
	

}
